#ifndef LIB_AX_SOLVE_PARAM_BASE_H
#define LIB_AX_SOLVE_PARAM_BASE_H
#include "libAcoustX/export.h"
#include "libGeoutils/property/properties.h"

#define AX_PARAM_OPTION_USING_THREADS_KEY		"opt_use_threads"
#define AX_PARAM_OPTION_GAUSSIAN_BEAM_KEY		"opt_gaussian_beam"
#define AX_PARAM_OPTION_COHERENT_KEY			"opt_coherent"
#define AX_PARAM_OPTION_SOLVE_ID_KEY			"opt_solve_id"
#define AX_PARAM_OPTION_SOLVE_NUMBER_KEY		"opt_solve_number"
#define AX_PARAM_OPTION_RAY_NUMBER_KEY			"opt_ray_number"

#define AX_PARAM_ANGLE_DE_START_KEY				"angle_de_start"
#define AX_PARAM_ANGLE_DE_END_KEY				"angle_de_end"
#define AX_PARAM_ANGLE_AZ_START_KEY				"angle_az_start"
#define AX_PARAM_ANGLE_AZ_END_KEY				"angle_az_end"

#define AX_PARAM_TARGET_RANGE_NUMBER_KEY		"target_range_number"
#define AX_PARAM_TARGET_RANGE_COORD_NUMBER_KEY	"target_range_coord_number"
#define AX_PARAM_TARGET_DEPTH_NUMBER_KEY		"target_depth_number"
#define AX_PARAM_TARGET_MIN_DEPTH_KEY			"target_min_depth"
#define AX_PARAM_TARGET_MAX_DEPTH_KEY			"target_max_depth"

namespace ax {
namespace param {
class AX_EXPORT Base : public geo::prop::Properties
{
public:
	using sptr = std::shared_ptr<Base>;
	using csptr = std::shared_ptr<const Base>;

	Base();
	virtual ~Base();

	QUICK_PROP_SETGET(bool, OptIsUseMutiThreads, AX_PARAM_OPTION_USING_THREADS_KEY)
	QUICK_PROP_SETGET(bool, OptIsUseGaussianBeam, AX_PARAM_OPTION_GAUSSIAN_BEAM_KEY)
	QUICK_PROP_SETGET(bool, OptIsUseCoherent, AX_PARAM_OPTION_COHERENT_KEY)
	QUICK_PROP_SETGET(std::string, OptSolveID, AX_PARAM_OPTION_SOLVE_ID_KEY)
	QUICK_PROP_SETGET(int, OptSolveNumber, AX_PARAM_OPTION_SOLVE_NUMBER_KEY)
	QUICK_PROP_SETGET(int, OptRayNumber, AX_PARAM_OPTION_RAY_NUMBER_KEY)

	QUICK_PROP_SETGET(double, AngleStartDe, AX_PARAM_ANGLE_DE_START_KEY)
	QUICK_PROP_SETGET(double, AngleEndDe, AX_PARAM_ANGLE_DE_END_KEY)
	QUICK_PROP_SETGET(double, AngleStartAz, AX_PARAM_ANGLE_AZ_START_KEY)
	QUICK_PROP_SETGET(double, AngleEndAz, AX_PARAM_ANGLE_AZ_END_KEY)

	QUICK_PROP_SETGET(int, TargetRangeNumber, AX_PARAM_TARGET_RANGE_NUMBER_KEY)
	QUICK_PROP_SETGET(int, TargetRangeCoordNumber, AX_PARAM_TARGET_RANGE_COORD_NUMBER_KEY)
	QUICK_PROP_SETGET(int, TargetDepthNumber, AX_PARAM_TARGET_DEPTH_NUMBER_KEY)
	QUICK_PROP_SETGET(double, TargetMinDepth, AX_PARAM_TARGET_MIN_DEPTH_KEY)
	QUICK_PROP_SETGET(double, TargetMaxDepth, AX_PARAM_TARGET_MAX_DEPTH_KEY)

protected:

private:

};

} // namespace param
} // namespace ax

#endif // !LIB_AX_SOLVE_PARAM_BASE_H
